home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
yacc.arc
/
DEXTERN
next >
Wrap
Text File
|
1985-09-04
|
7KB
|
261 lines
# include <stdio.h>
# include <ctype.h>
# include "files"
/* MANIFEST CONSTANT DEFINITIONS */
/* base of nonterminal internal numbers */
# define NTBASE 010000
/* internal codes for error and accept actions */
# define ERRCODE 8190
# define ACCEPTCODE 8191
/* sizes and limits */
# ifdef HUGE
# define ACTSIZE 12000
# define MEMSIZE 12000
# define NSTATES 750
# define NTERMS 127
# define NPROD 600
# define NNONTERM 300
# define TEMPSIZE 1200
# define CNAMSZ 5000
# define LSETSIZE 600
# define WSETSIZE 350
# endif
# ifdef MEDIUM
# define ACTSIZE 4000
# define MEMSIZE 5200
# define NSTATES 600
# define NTERMS 127
# define NPROD 400
# define NNONTERM 200
# define TEMPSIZE 800
# define CNAMSZ 4000
# define LSETSIZE 450
# define WSETSIZE 250
# endif
# define NAMESIZE 50
# define NTYPES 63
# ifdef WORD32
# define TBITSET ((32+NTERMS)/32)
/* bit packing macros (may be machine dependent) */
# define BIT(a,i) ((a)[(i)>>5] & (1<<((i)&037)))
# define SETBIT(a,i) ((a)[(i)>>5] |= (1<<((i)&037)))
/* number of words needed to hold n+1 bits */
# define NWORDS(n) (((n)+32)/32)
# else
# define TBITSET ((16+NTERMS)/16)
/* bit packing macros (may be machine dependent) */
# define BIT(a,i) ((a)[(i)>>4] & (1<<((i)&017)))
# define SETBIT(a,i) ((a)[(i)>>4] |= (1<<((i)&017)))
/* number of words needed to hold n+1 bits */
# define NWORDS(n) (((n)+16)/16)
# endif
/* relationships which must hold:
TBITSET ints must hold NTERMS+1 bits...
WSETSIZE >= NNONTERM
LSETSIZE >= NNONTERM
TEMPSIZE >= NTERMS + NNONTERMs + 1
TEMPSIZE >= NSTATES
*/
/* associativities */
# define NOASC 0 /* no assoc. */
# define LASC 1 /* left assoc. */
# define RASC 2 /* right assoc. */
# define BASC 3 /* binary assoc. */
/* flags for state generation */
# define DONE 0
# define MUSTDO 1
# define MUSTLOOKAHEAD 2
/* flags for a rule having an action, and being reduced */
# define ACTFLAG 04
# define REDFLAG 010
/* output parser flags */
# define YYFLAG1 (-1000)
/* macros for getting associativity and precedence levels */
# define ASSOC(i) ((i)&03)
# define PLEVEL(i) (((i)>>4)&077)
# define TYPE(i) ((i>>10)&077)
/* macros for setting associativity and precedence levels */
# define SETASC(i,j) i|=j
# define SETPLEV(i,j) i |= (j<<4)
# define SETTYPE(i,j) i |= (j<<10)
/* looping macros */
# define TLOOP(i) for(i=1;i<=ntokens;++i)
# define NTLOOP(i) for(i=0;i<=nnonter;++i)
# define PLOOP(s,i) for(i=s;i<nprod;++i)
# define SLOOP(i) for(i=0;i<nstate;++i)
# define WSBUMP(x) ++x
# define WSLOOP(s,j) for(j=s;j<cwp;++j)
# define ITMLOOP(i,p,q) q=pstate[i+1];for(p=pstate[i];p<q;++p)
# define SETLOOP(i) for(i=0;i<tbitset;++i)
/* I/O descriptors */
extern FILE * finput; /* input file */
extern FILE * faction; /* file for saving actions */
extern FILE *fdefine; /* file for # defines */
extern FILE * ftable; /* y.tab.c file */
extern FILE * ftemp; /* tempfile to pass 2 */
extern FILE * foutput; /* y.output file */
/* structure declarations */
struct looksets {
int lset[TBITSET];
};
struct item {
int *pitem;
struct looksets *look;
};
struct toksymb {
char *name;
int value;
};
struct ntsymb {
char *name;
int tvalue;
};
struct wset {
int *pitem;
int flag;
struct looksets ws;
};
/* token information */
extern int ntokens ; /* number of tokens */
extern struct toksymb tokset[];
extern int toklev[]; /* vector with the precedence of the terminals */
/* nonterminal information */
extern int nnonter ; /* the number of nonterminals */
extern struct ntsymb nontrst[];
/* grammar rule information */
extern int nprod ; /* number of productions */
extern int *prdptr[]; /* pointers to descriptions of productions */
extern int levprd[] ; /* contains production levels to break conflicts */
/* state information */
extern int nstate ; /* number of states */
extern struct item *pstate[]; /* pointers to the descriptions of the states */
extern int tystate[]; /* contains type information about the states */
extern int defact[]; /* the default action of the state */
extern int tstates[]; /* the states deriving each token */
extern int ntstates[]; /* the states deriving each nonterminal */
extern int mstates[]; /* the continuation of the chains begun in tstates and n
tstates */
/* lookahead set information */
extern struct looksets lkst[];
extern int nolook; /* flag to turn off lookahead computations */
/* working set information */
extern struct wset wsets[];
extern struct wset *cwp;
/* storage for productions */
extern int mem0[];
extern int *mem;
/* storage for action table */
extern int amem[]; /* action table storage */
extern int *memp ; /* next free action table position */
extern int indgo[]; /* index to the stored goto table */
/* temporary vector, indexable by states, terms, or ntokens */
extern int temp1[];
extern int lineno; /* current line number */
/* statistics collection variables */
extern int zzgoent ;
extern int zzgobest ;
extern int zzacent ;
extern int zzexcp ;
extern int zzclose ;
extern int zzrrconf ;
extern int zzsrconf ;
/* define functions with strange types... */
extern char *cstash();
extern struct looksets *flset();
extern char *symnam();
extern char *writem();
/* default settings for a number of macros */
/* name of yacc tempfiles */
# ifndef TEMPNAME
# define TEMPNAME "yacc.tmp"
# endif
# ifndef ACTNAME
# define ACTNAME "yacc.act"
# endif
/* output file name */
# ifndef OFILE
# define OFILE "ytab.c"
# endif
/* user output file name */
# ifndef FILEU
# define FILEU "youtput"
# endif
/* output file for # defines */
# ifndef FILED
# define FILED "ytab.h"
# endif
/* command to clobber tempfiles after use */
# ifndef ZAPFILE
# define ZAPFILE(x) unlink(x)
# endif